<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 函数定义阶段
        //    在堆内存中开辟一块空间
        //    把函数中的代码存储到这个空间中
        //    在栈内存中会存储一个变量指向这个空间 ， 变量名就是这个具名函数的名字

        // 函数调用阶段
        //    根据栈内存中的变量存储的地址去找到堆中的这个空间
        //    在调用栈中生成一块执行空间
        //    在执行栈中完成形参赋值，完成预解析，代码的执行
        //    这个执行空间销毁


        // 当函数返回了一个引用数据类型的时候
        // 并且外部变量接收了这个引用数据类型的时候
        // 就会形成不被销毁的执行空间


        function fn() {
            var a = 1 ;
            return {a}
        }

        const res = fn() ;
        // 调用fn函数以后，生成变量a  函数返回了一个对象   在内存中开辟一块地址->对象
        // 使用了res 接受了这个对象  --- 函数内部生成的地址被外部变量res接收了   --- 这块地址没有销毁

        console.log(res);
        console.log(res.a);

    </script>
    
</body>
</html>